package com.qianfeng.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

/**
 * 1. 提供获取数据库连接的静态方法 2. 提供关闭数据库连接的静态方法、不同的情况使用方法重载 3.
 * 数据库相关信息从db.properties配置文件读取 4. 数据库连接池只需要一个
 * 
 * db.properties文件中的内容只加载一次 驱动只加载一次
 * 
 * @author JIKE
 *
 */
public class DBUtil {

	private static Properties prop;
	private static DataSource ds;

	private final static String DB_PROPERTIES = "db.properties";
	static {
		try {
			prop = new Properties();
			// 获取到类加载器以后，通过类加载器提供的方法读取配置文件
			InputStream in = 
					DBUtil.class.getClassLoader().getResourceAsStream(DB_PROPERTIES);
			prop.load(in);
			in.close();
			// 初始化数据库连接池
			ds = DruidDataSourceFactory.createDataSource(prop);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 获取数据库连接池(数据源)
	 * 
	 * @return
	 */
	public static DataSource getDataSource() {
		return ds;
	}

	/**
	 * 获取数据库连接
	 * 
	 * @return
	 */
	public static Connection getConnection() {
		Connection conn = null;
		try {
			conn = ds.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}

	/**
	 * 释放资源
	 * 
	 * @param conn
	 */
	public static void close(Connection conn) {
		try {
			if (conn != null) {
				conn.close();
			}

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 释放资源
	 * 
	 * @param conn
	 * @param st
	 */
	public static void close(Connection conn, Statement st) {
		close(conn);
		if (st != null) {
			try {
				st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

	/**
	 * 释放资源
	 * 
	 * @param conn
	 * @param st
	 * @param rs
	 */
	public static void close(Connection conn, Statement st, ResultSet rs) {
		close(conn, st);
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}
